function add(x, y, z) {
  return x + y + z
}

function add1(x, y, z) {
  x += 2
  y *= 2
  z *= z
  return x + y + z
}

function makeAdd(count) {
  return function (num) {
    return count + num
  }
}

function log(date, type, message) {
  console.log(`[${date.getHours()}:${date.getMinutes()}][${type}]:[${message}]`);
}

// 柯里化函数实现——自动柯里化
function yzCurrying(fn) {
  function curried(...args) {
    // 判断当前已经接受的参数个数，与该函数的参数是否一致
    // 1.当已经传入的参数 大于等于 需要的参数时，就执行函数
    if (args.length >= fn.length) {
      return fn.apply(this, args)
    } else {
      // 没有达到参数个数，要返回一个新的函数，继续接收参数
      function curried2(...args2) {
        // 接收到参数后，需要递归调用curried来检查函数个数是否达到，这里有个闭包
        return curried.apply(this, [...args, ...args2])
      }
      return curried2
    }
  }
  return curried

}
var curryAdd = yzCurrying(add1)
console.log(curryAdd(10, 20, 30));
console.log(curryAdd(10, 20)(30));
console.log(curryAdd(10)(20)(30));



